| XML 자원코드에서 직접 레이아웃 생성 | 코드에서 직접 레이아웃 생성 |
|---|---|
| 가장 많이 사용하는 방법 res/layout 폴더에 위치한 XML 파일들을 이용하여 레이아웃을 구성함 화면구성을 코드와 분리시켜 유지보수시 편리 레이아웃 편집기를 이용해서 편집할 수도 있음 | XML에 비해 복잡하고 유지보수에 어려움이 있음 |
| 종류 | 설명 |
|---|---|
| 리니어 레이아웃(Linear Layout) | 어떻게 정렬할 것인지 지정하느냐에 따라 수평 또는 수직으로 모든 자식 요소들을 한 방향으로 정렬 |
| 프레임 레이아웃(Frame Layout) | 왼쪽 상단에 위치하게 하고, 위로 쌓이게 하는 구조 |
| 릴레이티브 레이아웃(Relative Layout) | 자식 객체들이 ID로 명명된 다른 객체나 부모 객체에 대해 상대적인 위치를 지정 |
| 테이블 레이아웃(Table Layout) | 하위의 객체들을 행과 열을 이용하여 배치. 각 셀은 위젯을 가지고, 각 행들은 가장 큰 열의 크기로 리사이징 된다. 셀의 테두리는 보여지지 않는다. |
| 탭 레이아웃(Tab Layout) | 탭을 구성할 수 있는 레이아웃 |
res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<!-- 3명의 고객정보에 대한 수직배치: 시작 -->
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" >
<TextView
android:text="@string/customer1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:text="@string/customer2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:text="@string/customer3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
<!-- 3명의 고객정보에 대한 수직배치: 끝 -->
<!-- 3가지 색에 대한 수평배치: 시작 -->
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" >
<TextView
android:text="@string/color1"
android:gravity="center_horizontal"
android:background="#ff0000"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1" />
<TextView
android:text="@string/color2"
android:gravity="center_horizontal"
android:background="#00ff00"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="3" />
<!-- 색 3 -->
<TextView
android:text="@string/color3"
android:gravity="center_horizontal"
android:background="#0000ff"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="3" />
</LinearLayout>
<!-- 3가지 색에 대한 수평배치: 끝 -->
</LinearLayout>
res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1">
<TableRow>
<TextView
android:layout_column="1"
android:text="Open..."
android:padding="3dip" />
<TextView
android:text="Ctrl-O"
android:gravity="right"
android:padding="3dip" />
</TableRow>
<TableRow>
<TextView
android:layout_column="1"
android:text="Save..."
android:padding="3dip" />
<TextView
android:layout_column="2"
android:text="Ctrl-S"
android:gravity="right"
android:padding="3dip" />
</TableRow>
<TableRow>
<TextView
android:layout_column="1"
android:text="Save As..."
android:padding="3dip" />
<TextView
android:text="Ctrl-Shift-S"
android:gravity="right"
android:padding="3dip" />
</TableRow>
<View
android:layout_height="2dip"
android:background="#FF909090" />
<TableRow>
<TextView
android:text="X"
android:padding="3dip" />
<TextView
android:text="Import..."
android:padding="3dip" />
</TableRow>
<TableRow>
<TextView
android:text="X"
android:padding="3dip" />
<TextView
android:text="Export..."
android:padding="3dip" />
<TextView
android:text="Ctrl-E"
android:gravity="right"
android:padding="3dip" />
</TableRow>
<View
android:layout_height="2dip"
android:background="#FF909090" />
<TableRow>
<TextView
android:layout_column="1"
android:text="Quit"
android:padding="3dip" />
</TableRow>
</TableLayout>
res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp" />
</LinearLayout>
</TabHost>
TabViewActivity.java
package com.andro;
import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TabHost;
public class TabViewActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources(); // 리소스 객체 생성
TabHost tabHost = getTabHost(); // 탭메뉴 액티비티 생성
TabHost.TabSpec spec; // 각 탭의 메뉴와 컨텐츠를 위한 객체 선언
Intent intent; // 각 탭에서 사용할 인텐트 선언
// 인텐트 생성
intent = new Intent().setClass(this, CustListActivity.class);
// 각 탭의 메뉴와 컨텐츠를 위한 객체 생성
spec = tabHost.newTabSpec("custList").setIndicator("고객현황").setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, CustRegActivity.class);
spec = tabHost.newTabSpec("custReg").setIndicator("고객등록").setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, CustHelpActivity.class);
spec = tabHost.newTabSpec("custHelp").setIndicator("도움말").setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(0);
}
}
CustListActivity.java
package com.andro;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class CustListActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 현재 객체에 TextView 객체 생성
TextView textview = new TextView(this);
// 출력할 문자 설정
textview.setText("고객현황 화면");
// 현재 객체에 TextView 객체에서 설정한 문자 출력
setContentView(textview);
}
}
res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp" >
</TextView>
res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">국가명</string>
<string-array name="countries_array">
<item>Afghanistan</item>
<item>Albania</item>
<item>Algeria</item>
<item>Anguilla</item>
<item>Bahrain</item>
<item>Bangladesh</item>
<item>Barbados</item>
<item>Belarus</item>
<item>Cambodia</item>
<item>Cameroon</item>
<item>Canada</item>
<item>Cuba</item>
</string-array>
</resources>
ListViewActivity.java
package com.andro;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.app.AlertDialog;
public class ListViewActivity extends ListActivity implements OnItemClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
///// 리스트뷰 생성: 시작 /////
// strings.xml에 정의된 국가명 아이템을 문자열 배열로 저장
String[] countries = getResources().getStringArray(R.array.countries_array);
// 문자열 배열의 각 문자열을 main.xml의 TextView로 대응하는 리스트뷰를 위한 커서를 만듦
setListAdapter(new ArrayAdapter<String>(this, R.layout.main, countries));
// 리스트뷰를 생성함
ListView lv = getListView();
///// 리스트뷰 생성: 끝 /////
// 리스트뷰의 클릭 대기
lv.setOnItemClickListener(this);
}
// 리스트뷰의 아이템이 클릭되었을 때 실행
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
AlertDialog.Builder alert = new AlertDialog.Builder(ListViewActivity.this);
alert.setTitle("알림창");
// 클릭된 아이템 위치, 아이템명 출력
alert.setMessage(position + ", " + ((TextView)view).getText() + "를 누르셨네요!");
alert.setIcon(R.drawable.ic_launcher);
alert.setPositiveButton("확인", null);
alert.show();
}
}
res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center" />
ImageAdapter.java
package com.andro;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
// 이미지셋에 있는아이템의 수를 반환함(그리드뷰는 아이템의 수에 해당하는 행렬을 준비함)
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// 주어진 위치(position)에 출력할 이미지를 반환함
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
// 이미지뷰에 주어진 위치의 이미지를 설정함
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
// 출력될 이미지 데이터셋(res/drawable 폴더)
private Integer[] mThumbIds = {
R.drawable.sample_0,
R.drawable.sample_1,
R.drawable.sample_2,
R.drawable.sample_3,
R.drawable.sample_4,
R.drawable.sample_5,
R.drawable.sample_6,
R.drawable.sample_7,
R.drawable.sample_0,
R.drawable.sample_1,
R.drawable.sample_2,
R.drawable.sample_3,
R.drawable.sample_4,
R.drawable.sample_5,
R.drawable.sample_6,
R.drawable.sample_7 };
}
GridViewActivity.java
package com.andro;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
public class GridViewActivity extends Activity implements OnItemClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// main.xml의 레이아웃에 있는 GridView를 인식함
GridView gridview = (GridView) findViewById(R.id.gridview);
// GridView에 이미지들을 배치함
gridview.setAdapter(new ImageAdapter(this));
// GridView에 나타나는 아이템에 대한 클릭 대기, 클릭되면 onItemClick() 메소드를 실행함
gridview.setOnItemClickListener(this);
}
// @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
AlertDialog.Builder alert = new AlertDialog.Builder(GridViewActivity.this);
alert.setTitle("알림창");
// 클릭된 이미지 위치 출력
alert.setMessage(position + "번째 이미지를 누르셨네요!");
alert.setIcon(R.drawable.ic_launcher);
alert.setPositiveButton("확인", null);
alert.show();
}
}